from app.utils.core import db
from sqlalchemy.dialects.mysql import DOUBLE


class PublishAPIServer(db.Model):
    """
    记录服务器中运行的服务
    """
    __tablename__ = "t_publish_api_server"
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)  # 运行服务器的主键ID
    task_id = db.Column(db.BIGINT, nullable=False)  # 任务ID 主键ID
    server_id = db.Column(db.BIGINT, nullable=False)  # 服务器ID
    task_type = db.Column(db.VARCHAR(36), nullable=False)   # 任务类型
    model_name = db.Column(db.VARCHAR(36), nullable=False)  # 模型名称
    variable_name = db.Column(db.VARCHAR(500), nullable=False)  # 变量名称
    labels = db.Column(db.VARCHAR(500), nullable=True)  # 标签类型
    feature = db.Column(db.VARCHAR(500), nullable=True)  # 离散值映射关系
    date_name = db.Column(db.VARCHAR(200), nullable=True)   #日期类型


class MaterialInfo(db.Model):
    """
    记录上传的素材文件
    """
    __tablename__ = "material_info"
    id = db.Column(db.Integer, primary_key=True)  # 素材的主键ID
    bucket_dir = db.Column(db.VARCHAR(200), nullable=False)  # 数据的bucket保存位置
    file_name = db.Column(db.VARCHAR(200), nullable=False)  # 素材名称
    file_name2 = db.Column(db.VARCHAR(200), nullable=False)   # 素材存储名称
    file_desc = db.Column(db.VARCHAR(200), nullable=False)  # 素材描述
    file_type = db.Column(db.VARCHAR(200), nullable=False)  # 素材类型
    file_size = db.Column(db.VARCHAR(200), nullable=False)  # 文件大小
    project_id = db.Column(db.BIGINT, nullable=False)  # 项目id
    creater = db.Column(db.VARCHAR(30), nullable=False)   #创建者
    create_time = db.Column(db.VARCHAR(200), nullable=False)  # 创建时间
    is_available = db.Column(db.Integer, nullable=False)  # 是否有效

class PredictTask(db.Model):
    """
        记录预测任务
    """
    __tablename__ = "publish_predict_task"
    id = db.Column(db.BIGINT, primary_key=True)  # 预测任务的主键ID
    task_name = db.Column(db.VARCHAR(100), nullable=True)  # 任务名称
    publish_id = db.Column(db.BIGINT, nullable=True)  # 部署任务id
    status = db.Column(db.VARCHAR(30), nullable=True) # 任务状态
    creater = db.Column(db.VARCHAR(30), nullable=True)  # 创建者
    create_time = db.Column(db.DATETIME, nullable=True) # 创建时间
    predict_file = db.Column(db.VARCHAR(500), nullable=True)  # 预测文件
    end_time = db.Column(db.DATETIME, nullable=True)  # 完成时间
    result_file = db.Column(db.VARCHAR(500), nullable=True)  # 结果文件
    error = db.Column(db.VARCHAR(500), nullable=True)  # 错误信息
    project_id = db.Column(db.BIGINT, nullable=True)  # 关联项目id
    start_time = db.Column(db.DATETIME, nullable=True)  # 任务开始时间
    total_row_data = db.Column(db.Integer, nullable=False)  # 预测数据总量
    predict_precent = db.Column(DOUBLE, nullable=False) # 预测进度百分比

class TrainingInfo(db.Model):
    """
        训练信息表
    """
    __tablename__ = "training_info"
    id = db.Column(db.BIGINT, primary_key=True)  # 预测任务的主键ID
    project_id = db.Column(db.BIGINT, nullable=True)  # 关联项目id
    file_id = db.Column(db.BIGINT, nullable=True)  #素材id
    file_name = db.Column(db.VARCHAR(200), nullable=True)  # 素材名称
    variable_name = db.Column(db.VARCHAR(10000), nullable=True)  # 变量名称
    target_column = db.Column(db.VARCHAR(255), nullable=True)    #目标名称
    algorithm_name = db.Column(db.VARCHAR(255), nullable=True)    #算法名称
    type = db.Column(db.VARCHAR(50), nullable=True)     #模型类型
    proportion = db.Column(db.VARCHAR(255), nullable=True)     #'数据集比例
    status = db.Column(db.VARCHAR(30), nullable=True)     #任务状态
    creater = db.Column(db.VARCHAR(30), nullable=True)     #创建者
    create_time = db.Column(db.VARCHAR(200), nullable=True)   # 创建时间
    error_information = db.Column(db.VARCHAR(255), nullable=True)   # 模型训练错误类型信息


class TrainingModelInfo(db.Model):
    """
        训练模型信息表
    """
    __tablename__ = "training_model_data"
    id = db.Column(db.BIGINT, primary_key=True)  # 预测任务的主键ID
    model_name = db.Column(db.VARCHAR(100), nullable=True)  # 模型名称
    project_id = db.Column(db.BIGINT, nullable=True)  #关联项目名称
    version = db.Column(db.VARCHAR(10), nullable=True)  # 模型版本
    status = db.Column(db.VARCHAR(10), nullable=True)  # 模型状态（发布/停用）
    remain_time = db.Column(db.BIGINT, nullable=True)    # 模型剩余时间，s为单位
    model_dir = db.Column(db.VARCHAR(150), nullable=True)     # 模型文件存放路径
    create_time = db.Column(db.DATETIME, nullable=True)     # 模型训练开始时间
    task_id = db.Column(db.BIGINT, nullable=True)     # 训练任务id
    creater = db.Column(db.VARCHAR(30), nullable=True)   # 创建者
    sdk_model_dir = db.Column(db.VARCHAR(150), nullable=True)  # 离线模型文件保存路径
    evaluate = db.Column(db.VARCHAR(255), nullable=True)  # 模型评估结果
    classifier = db.Column(db.VARCHAR(15000), nullable=True)  # 长度
    end_time = db.Column(db.DATETIME, nullable=True)  # 模型训练结束时间
    arithmetic = db.Column(db.VARCHAR(50), nullable=True)  # 算法名称
    logistic_formula = db.Column(db.VARCHAR(1000), nullable=True)    # 逻辑/线性回归公式
    predict_file = db.Column(db.VARCHAR(150), nullable=True)     # 聚类与相关性的预测结果
    center = db.Column(db.VARCHAR(500), nullable=True)     # 聚类中心点数据
    application_type = db.Column(db.VARCHAR(255), nullable=True)     # 应用类型
    is_external_import = db.Column(db.INT, nullable=True)   # 是否外部导入的模型,1:否；2：是
    model_file_type = db.Column(db.VARCHAR(30), nullable=True)  # 模型文件类型:sklearn、matlab
    api = db.Column(db.VARCHAR(200), nullable=True)  # 测试接口


class PublishTaskData(db.Model):
    """
        部署任务表
    """
    __tablename__ = "publish_task_data"
    id = db.Column(db.BIGINT, primary_key=True)  # 预测任务的主键ID
    task_name = db.Column(db.VARCHAR(100), nullable=True)  # 任务名称
    model_id = db.Column(db.BIGINT, nullable=True)  #模型id，关联模型表
    status = db.Column(db.VARCHAR(30), nullable=True)  # 任务状态
    task_desc = db.Column(db.VARCHAR(500), nullable=True)  # 任务描述（发布/停用）
    creater = db.Column(db.VARCHAR(30), nullable=True)   # 创建者
    create_time = db.Column(db.DATETIME, nullable=True)     # 创建时间
    publisher = db.Column(db.VARCHAR(30), nullable=True)     # 发布者
    publish_time = db.Column(db.DATETIME, nullable=True)   # 发布时间
    fail_count = db.Column(db.INT, nullable=True)  # 调用失败次数
    total_count = db.Column(db.INT, nullable=True)  # 调用总次数
    running_time = db.Column(db.BIGINT, nullable=True)  # 运行时间,单位秒
    project_id = db.Column(db.BIGINT, nullable=True)  # 关联项目id



class Project(db.Model):
    """
        部署任务表
    """
    __tablename__ = "project"
    id = db.Column(db.BIGINT, primary_key=True)  # 任务的主键ID
    project_name = db.Column(db.VARCHAR(50), nullable=True)  # 项目名称
    project_desc = db.Column(db.VARCHAR(500), nullable=True)  #项目描述
    creater = db.Column(db.VARCHAR(30), nullable=True)   # 创建者
    create_time = db.Column(db.DATETIME, nullable=True)     # 创建时间
    project_type = db.Column(db.VARCHAR(255), nullable=True)     # 项目类型
    progress_rate = db.Column(db.VARCHAR(255), nullable=True)   # 项目进度
    status = db.Column(db.VARCHAR(255), nullable=True)  # 运行状态 unpublish:停止, published:发布
    is_available = db.Column(db.INT, nullable=True)  # 是否有效
    app_id = db.Column(db.VARCHAR(32), nullable=True)  # appid
    app_key = db.Column(db.VARCHAR(64), nullable=True)  # appkey
    model_file_type = db.Column(db.VARCHAR(30), nullable=True)  # 模型文件类型：sklearn；matlab

